<?php
/* 
 * ********* CVS HEADER ********* 
 * 
 * $RCSfile: recherche.php,v $ 
 * $Date: 2005/08/31 10:13:46 $ 
 * $Revision: 1.2 $ 
 * 
 * ********* CVS HEADER ********* 
 */
/**
 * Effectue une recherche et permet de parcourir les resultats 
 * 
 * Parametre: [RPORTAL] recherche.syntaxe.booleenne 
 * Valeur: yes = syntaxe booleenne
 *         no  = syntaxe classique (pas de symbole cle)
 *
 * Syntaxe de la recherche dans le cas de la recherche booleenne:
 * 1) pour un mot donne (par exemple: val), 
 * le moteur de recherche va chercher tous les mots contenant la chaine de caracteres
 * 2) tous les mots entre "" seront cherches de maniere exacte
 * 3) les mots separes avec un espace sont recherches avec un ET
 * 4) les mots vides de sens sont supprimes
 * 5) on peut forcer la prise en compte d'un mot en mettant un + devant
 * 6) on peut forcer l'exclusion d'un mot en mettant un - devant (on ne veut pas que ce mot apparaisse)
 */
require_once(get_path_module("recherche.resultat"));

class MoteurRecherche {
	
	var $resultats = array();
	var $nb = 0;
	var $pointeur = 0;
	var $_page = 1;
	var $_requete = '';
	
	var $nbi = 0;
	
	function MoteurRecherche($requete,$page){
		$this->_page = $page;
		$this->_requete = $requete;
		return $this->_recherche();
	}
	
	function nbrResultats(){
		return $this->nb;
	}
	
	function idDebut(){
		global $rportalparams;
		$plage = $rportalparams->get_value('RPORTAL','recherche.pagination.nb');
		$plage=($plage) ? $plage : 20;
		return ($this->_page*$plage)-$plage;
	}
	
	function idFin(){
		return $this->idDebut + $this->nbi;	
	}
	
	function prochainResultat(){
		if($this->pointeur==$this->nbi) return false;
		$tmp = $this->resultats[$this->pointeur];
		$this->pointeur++;
		return $tmp;
	}
	
	function precedentResultat(){
		if($this->pointeur==0) return false;
		$this->pointeur--;
		$tmp = $this->resultats[$this->pointeur];
		return $tmp;
	}
	
	function changerPage($page){
		$this->_page = $page;
		return $this->_recherche();
	}
	
	function _recherche(){
		global $rportalparams,$session;
		$bool = $rportalparams->get_value('RPORTAL','recherche.syntaxe.booleenne')=='yes';
		$plage = $rportalparams->get_value('RPORTAL','recherche.pagination.nb');
		$page=($this->_page) ? $this->_page : 1;
		$plage=($plage) ? $plage : 20;
		$debut=($page*$plage)-$plage;
		
		$requete = $this->_requete;
		
		$query = "SELECT moteur.*, MATCH (moteur.titre,moteur.description,moteur.texte) AGAINST ('".$requete."') AS score FROM rportal_moteur_url AS moteur,html,hierarchie WHERE MATCH (moteur.titre,moteur.description,moteur.texte) AGAINST ('".$requete."') AND moteur.id_html=html.id AND html.droit=hierarchie.id_groupe AND hierarchie.id_groupe_dessus='{$session['id_groupe']}' AND html.publier='1' LIMIT $debut,$plage";
		$querynb = "SELECT count(*) AS nb FROM rportal_moteur_url AS moteur,html,hierarchie WHERE MATCH (moteur.titre,moteur.description,moteur.texte) AGAINST ('".$requete."') AND moteur.id_html=html.id AND html.droit=hierarchie.id_groupe AND hierarchie.id_groupe_dessus='{$session['id_groupe']}' AND html.publier='1'";
		if(true==$bool){
			$query = "SELECT moteur.*, MATCH (moteur.titre,moteur.description,moteur.texte) AGAINST ('".$requete."' IN BOOLEAN MODE) AS score FROM rportal_moteur_url AS moteur,html,hierarchie WHERE MATCH (moteur.titre,moteur.description,moteur.texte) AGAINST ('".$requete."' IN BOOLEAN MODE) AND moteur.id_html=html.id AND html.droit=hierarchie.id_groupe AND hierarchie.id_groupe_dessus='{$session['id_groupe']}' AND html.publier='1' LIMIT $debut,$plage";
			$querynb = "SELECT count(*) AS nb FROM rportal_moteur_url AS moteur,html,hierarchie WHERE MATCH (moteur.titre,moteur.description,moteur.texte) AGAINST ('".$requete."' IN BOOLEAN MODE) AND moteur.id_html=html.id AND html.droit=hierarchie.id_groupe AND hierarchie.id_groupe_dessus='{$session['id_groupe']}' AND html.publier='1'";
		}
		$result=rportalrequete($querynb) or rportalerreur($query,"?op=");
		$row=rportalligne($result);
		$this->nb=$row[0];
		
		
		$result=rportalrequete($query) or rportalerreur($query,"?op=");
		$this->nbi = rportalnbresult($result);
		while($row = rportalligne($result)){
			$obj = new MoteurResultat;
			$obj->url = $row['url'];
			$obj->titre = $row['titre'];
			$obj->description = $row['description'];
			$obj->note = $row['score'];
			$obj->HTMLID = $row['id_html'];
			$obj->type = $row['type'];
			$this->resultats[] = $obj;
		}
		$this->pointeur = 0;
	}
}
?>